<p>无法依靠Java的垃圾回收来清理所有内容。具体来说，必须在创建后手动关闭实现<code> Closeable </code>接口或它的超级接口<code> AutoCloseable </code>的连接，流，文件和其他类。
  否则，将导致资源泄漏，这可能首先导致应用程序崩溃，然后可能使应用程序崩溃。</p>

<h2>不规范代码示例</h2>

<pre>
OutputStream stream = null;
try{
  for (String property : propertyList) {
    stream = new FileOutputStream("myfile.txt");  // 不合规
    // ...
  }
}catch(Exception e){
  // ...
}finally{
  stream.close();  // 打开了多个流。仅最后一个关闭。
}
</pre>

<h2>正确代码示例</h2>

<pre>
OutputStream stream = null;
try{
  stream = new FileOutputStream("myfile.txt");
  for (String property : propertyList) {
    // ...
  }
}catch(Exception e){
  // ...
}finally{
  stream.close();
}
</pre>

<h2>例外</h2>

<p>Java 7引入了try-with-resources语句，该语句隐式关闭<code> Closeables </code>。在try-with-resources语句中打开的所有资源都被该规则忽略。</p>

<pre>
try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
  //...
}
catch ( ... ) {
  //...
}
</pre>

<h2>更多</h2>

<ul>
  <li><a href="http://cwe.mitre.org/data/definitions/459.html">MITRE, CWE-459</a> - Incomplete Cleanup</li>
  <li><a href="https://www.securecoding.cert.org/confluence/x/9gFqAQ">CERT, FIO04-J</a> - Release resources when they are no longer needed</li>
</ul>
